package vista;

import interfaces.IDibujable;
import interfaces.ILaberinto;
import interfaces.IPacman;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.geom.Line2D;
import java.util.ArrayList;

import javax.swing.ImageIcon;

import utilidades.Constantes;
import utilidades.UtilidadesDeArchivos;
import utilidades.Vector;

public class GraficosDelPacman implements IDibujable {
	private IPacman pack;
	private ILaberinto nivel;
	private int indiceDeEstado,indiceDeImagen;
	private ArrayList<Image> imagenes;	
	private long tiempoInicial;
	private boolean modoDebug;
	
	private static final int deltaCommon = 100,deltaDying = 200;
	private long delta = deltaCommon;

	public GraficosDelPacman(String[] caminos,IPacman pMan,ILaberinto nivel,boolean debug){
		this.pack = pMan;
		this.nivel = nivel;
		this.indiceDeEstado = 3;
		this.indiceDeImagen = 0;
		this.imagenes = new ArrayList<Image>();
		this.tiempoInicial = System.currentTimeMillis(); 
		this.modoDebug = debug;
		cargarImagenes(caminos);
	}

	private void cargarImagenes(String[] pathImagenes){
		for (int i=0; i<20 ;i++){
			imagenes.add(new ImageIcon(UtilidadesDeArchivos.completarRuta(pathImagenes[i] )).getImage());
		}
	}

	public void nextState(){
		indiceDeEstado = (indiceDeEstado+1)%5;
		resetearAnimacion();
	}

	public IPacman obtenerPackman(){
		return pack;
	}
	
	private void resetearAnimacion(){
		tiempoInicial = System.currentTimeMillis(); 
		delta = (indiceDeEstado == 4)? deltaDying:deltaCommon;
		indiceDeImagen = 0;
	}
	
	public void cambiarImagen(Vector direction){
		if(direction.esIgualA(Constantes.IZQUIERDA))
			cambiarEstado(0);
		if(direction.esIgualA(Constantes.DERECHA))
			cambiarEstado(1);
		if(direction.esIgualA(Constantes.ARRIBA))
			cambiarEstado(2);
		if(direction.esIgualA(Constantes.ABAJO))
			cambiarEstado(3);
	}	
	
	private void cambiarEstado(int state){
		if((!pack.estaMuerto()) && (indiceDeEstado != state)){
			indiceDeEstado = state;
			resetearAnimacion();
		}
	}
	
	public void dibujar(Graphics g) {		
		dibujarPacman(g);
		dibujarPuntaje(g);
	}

	private void dibujarPuntaje(Graphics g){
		g.setColor(Constantes.COLOR_TEXTO);
		g.setFont(new Font("Serif",Font.PLAIN,Constantes.TAMANIO_TEXTO));

		int puntaje = pack.obtenerPuntaje();
		g.drawString("Puntaje: " + puntaje,10,210);

		int vidas = pack.obtenerVidas();
		g.drawString("Vidas: " + vidas,10,320);
	}	
	
	private void dibujarPacman(Graphics g){
		if (pack.estaMuerto())
			indiceDeEstado = 4;
		else
			cambiarImagen(pack.obtenerUltimaDireccion());
		
		actualizarIndice();

		int index = indiceDeImagen+4*indiceDeEstado;
		Image imagen = imagenes.get(index);
		
		Vector posicion = pack.obtenerPosicion();
		
		int anchoCasilla = Constantes.ANCHO_PANTALLA / nivel.obtenerCantidadColumnas(); 
		int altoCasilla = Constantes.ALTO_PANTALLA / nivel.obtenerCantidadFilas(); 
		
		int centroX = posicion.obtenerCoordenadaX()*anchoCasilla + Constantes.OFFSET_CASILLAS_X;
		int centroY = posicion.obtenerCoordenadaY()*altoCasilla + Constantes.OFFSET_CASILLAS_Y;

		g.drawImage(imagen,centroX-Constantes.ANCHO_IMAGEN/2,centroY-Constantes.ANCHO_IMAGEN/2,Constantes.ANCHO_IMAGEN,Constantes.ALTO_IMAGEN,null);
		
		if(modoDebug){
			Graphics2D g2 = (Graphics2D)g;
			g2.setStroke(new BasicStroke(3));
			g.setColor(new Color(255,0,0));

			g2.draw(new Line2D.Float(centroX,centroY,centroX,centroY));	
		}

	}
	
	private void actualizarIndice(){
		long time = System.currentTimeMillis();
		
		if((time-tiempoInicial) > delta){
			tiempoInicial = time;

			if((indiceDeEstado != 4) || (indiceDeImagen != 3))
				indiceDeImagen = (indiceDeImagen+1)%4;
		}

	}
}
